package view.contacto;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;

import model.Alumno;
import model.Area;
import model.Contacto;
import model.Curso;
import model.PersonalAdministrativo;
import model.comunication.IAlumno;
import model.comunication.IArea;
import model.comunication.IContacto;
import model.comunication.ICurso;
import view.confirmaciones.ConfirmacionEvento;
import view.eventos.CrearEvento;

import com.toedter.calendar.JDateChooser;

public class CrearContacto extends JDialog {

	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	private JTextField textNombre;
	private JTextField textTelefono;
	private JTextArea textDescripcion;
	private JTextField textApellido;
	private JTextField textEmail;
	private JDateChooser dateNacimiento;
	private JTable tablaIntereses;
	private JComboBox<String> comboCurso;
	private JComboBox<String> comboArea;
	private IAlumno comunicationAlumno = IAlumno.getInstance();
	private IArea comunicationArea = IArea.getInstance();
	private ICurso comunicationCurso = ICurso.getInstance();
	private IContacto comunicationContacto = IContacto.getInstance();
	private DefaultTableModel modelo;
	private PersonalAdministrativo empleado;
	private Alumno alumno;
	private boolean nuevo;
	private Contacto contacto;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {
			CrearContacto dialog = new CrearContacto();

			dialog.setNuevo(false);
			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			dialog.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the dialog.
	 */
	public CrearContacto(Alumno alumno, PersonalAdministrativo personalAdministrativo) {
		this.empleado = personalAdministrativo;
		this.alumno = alumno;
		initialize();
		loadData();
	}

	public void initialize() {

		setTitle("Crear Contacto");
		setResizable(false);
		setModal(true);
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		setBounds(100, 550, 400, 644);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(null);
		this.setLocationRelativeTo(null);
		JLabel lblNombre = new JLabel("Nombre:");
		lblNombre.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblNombre.setBounds(12, 11, 128, 14);
		contentPanel.add(lblNombre);
		JLabel lblApellido = new JLabel("Apellido:");
		lblApellido.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblApellido.setBounds(196, 11, 116, 14);
		contentPanel.add(lblApellido);
		textNombre = new JTextField();
		textNombre.setBounds(12, 36, 176, 20);
		contentPanel.add(textNombre);
		textNombre.setColumns(10);
		JLabel lblTelefono = new JLabel("Telefono:");
		lblTelefono.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblTelefono.setBounds(12, 67, 102, 14);
		contentPanel.add(lblTelefono);
		textTelefono = new JTextField();
		textTelefono.setColumns(10);
		textTelefono.setBounds(12, 92, 176, 20);
		contentPanel.add(textTelefono);
		JLabel lblEmail = new JLabel("Email:");
		lblEmail.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblEmail.setBounds(196, 67, 128, 14);
		contentPanel.add(lblEmail);
		JLabel lblDescripcion = new JLabel("Descripcion:");
		lblDescripcion.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblDescripcion.setBounds(12, 162, 78, 14);
		contentPanel.add(lblDescripcion);
		textDescripcion = new JTextArea();
		textDescripcion.setLineWrap(true);
		textDescripcion.setWrapStyleWord(true);

		JScrollPane scrollTextArea = new JScrollPane();
		scrollTextArea.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollTextArea.setViewportView(textDescripcion);
		scrollTextArea.setBounds(12, 187, 374, 70);
		contentPanel.add(scrollTextArea);

		/* //// Area //// */
		JLabel lblArea = new JLabel("Area:");
		lblArea.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblArea.setBounds(12, 264, 46, 14);
		contentPanel.add(lblArea);

		comboArea = new JComboBox<String>();
		comboArea.setBounds(12, 290, 302, 20);
		contentPanel.add(comboArea);
		List<Area> Iareas = comunicationArea.getAllAreas();
		for (Area area : Iareas) {
			comboArea.addItem(area.getNombre());
		}

		JLabel lblSubinteres_1 = new JLabel("Curso:");
		lblSubinteres_1.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblSubinteres_1.setBounds(12, 324, 78, 14);
		contentPanel.add(lblSubinteres_1);

		textApellido = new JTextField();
		textApellido.setColumns(10);
		textApellido.setBounds(196, 36, 188, 20);
		contentPanel.add(textApellido);

		textEmail = new JTextField();
		textEmail.setColumns(10);
		textEmail.setBounds(196, 92, 188, 20);
		contentPanel.add(textEmail);

		dateNacimiento = new JDateChooser();
		dateNacimiento.setBounds(12, 131, 339, 20);
		contentPanel.add(dateNacimiento);

		comboCurso = new JComboBox<String>();
		comboCurso.setBounds(12, 349, 302, 20);
		contentPanel.add(comboCurso);
		List<Curso> Icursos = comunicationCurso.getAllCursos();
		for (Curso curso : Icursos) {
			comboCurso.addItem(curso.getNombre());
		}
		final JCheckBox generarEvento = new JCheckBox("\u00BFDesea generar un evento a partir de este contacto?");
		generarEvento.setFont(new Font("Tahoma", Font.BOLD, 11));
		generarEvento.setBounds(12, 553, 365, 23);
		contentPanel.add(generarEvento);

		JLabel lblFechaDeNacimiento = new JLabel("Fecha de nacimiento:");
		lblFechaDeNacimiento.setFont(new Font("Tahoma", Font.BOLD, 11));
		dateNacimiento.add(lblFechaDeNacimiento, BorderLayout.WEST);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 390, 374, 154);
		contentPanel.add(scrollPane);

		tablaIntereses = new JTable();
		tablaIntereses.setModel(new DefaultTableModel(new Object[][] {}, new String[] { "Area", "Curso" }));
		tablaIntereses.getTableHeader().setReorderingAllowed(false);
		scrollPane.setViewportView(tablaIntereses);

		modelo = (DefaultTableModel) tablaIntereses.getModel();
		JButton btnArea = new JButton("Seleccionar Area");
		btnArea.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				// comboCurso.removeAllItems();
				// Area area = comunicationArea.findArea(comboArea.getSelectedItem().toString());
				// List<Curso> Icursos = comunicationCurso.getCurso((int) area.getId());
				// for (Curso curso : Icursos) {
				// comboCurso.addItem(curso.getNombre());
				// }

				modelo.addRow(new String[] { (String) comboArea.getSelectedItem(), "" });
			}
		});

		btnArea.setBounds(322, 289, 62, 23);
		contentPanel.add(btnArea);

		JButton btnCurso = new JButton("Seleccionar Curso");
		btnCurso.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Curso curso = comunicationCurso.getCurso((String) comboCurso.getSelectedItem());
				Area area = comunicationArea.getArea(curso.getIdArea());
				modelo.addRow(new String[] { area != null ? area.getNombre() : "", (String) comboCurso.getSelectedItem() });
			}
		});
		btnCurso.setBounds(322, 348, 62, 23);
		contentPanel.add(btnCurso);

		JPanel buttonPane = new JPanel();
		buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
		getContentPane().add(buttonPane, BorderLayout.SOUTH);
		JButton okButton = new JButton(" Guardar");
		okButton.setIcon(new ImageIcon(CrearContacto.class.getResource("/Icon_/save_16.png")));
		okButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		okButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (todoCorrecto()) {
					Contacto contacto;
					if (nuevo) {
						Alumno alumno = comunicationAlumno.getAlumno(textNombre.getText(), textApellido.getText(), textEmail.getText(), textTelefono.getText(), null, dateNacimiento.getCalendar(),
								null);
						alumno.setId(comunicationAlumno.addAlumno(alumno));
						List<Area> areas = recuperarAreas();
						List<Curso> cursos = recuperarCursos();
						contacto = comunicationContacto.getContacto(Calendar.getInstance(), textDescripcion.getText(), areas, cursos, alumno, empleado);
						contacto.setId(comunicationContacto.addContacto(contacto));
					} else {
						List<Area> areas = recuperarAreas();
						List<Curso> cursos = recuperarCursos();
						contacto = comunicationContacto.getContacto(Calendar.getInstance(), textDescripcion.getText(), areas, cursos, alumno != null ? alumno : new Alumno(), empleado);
						contacto.setId(comunicationContacto.addContacto(contacto));
					}

					CrearContacto.this.contacto = contacto;

					if (generarEvento.isSelected()) {
						CrearEvento evento = new CrearEvento(empleado);
						evento.setId(alumno != null ? alumno.getId() : 0, contacto);
						evento.setVisible(true);

						dispose();
					} else {
						dispose();
						ConfirmacionEvento evento = new ConfirmacionEvento(empleado);
						evento.setId(alumno != null ? alumno.getId() : 0, contacto);
						evento.setVisible(true);
						dispose();
					}
				}
			}
		});
		okButton.setActionCommand("OK");
		buttonPane.add(okButton);
		getRootPane().setDefaultButton(okButton);
		JButton cancelButton = new JButton(" Cancel");
		cancelButton.setIcon(new ImageIcon(CrearContacto.class.getResource("/Icon_/exit.png")));
		cancelButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		cancelButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				dispose();
			}
		});
		cancelButton.setActionCommand("Cancel");
		buttonPane.add(cancelButton);

	}

	/**
	 * Create the dialog.
	 */
	public CrearContacto() {
		initialize();
	}

	private void loadData() {
		this.textNombre.setText(this.alumno.getNombre());
		this.textNombre.setEditable(false);
		this.textApellido.setText(this.alumno.getApellido());
		this.textApellido.setEditable(false);
		this.textEmail.setText(this.alumno.getEmail());
		this.textEmail.setEditable(false);
		this.dateNacimiento.setCalendar(this.alumno.getNacimiento());
		this.dateNacimiento.getCalendarButton().setEnabled(false);
		this.textTelefono.setText(this.alumno.getTelefono());
		this.textTelefono.setEditable(false);
	}

	private List<Curso> recuperarCursos() {
		List<Curso> lista = new ArrayList<Curso>();
		for (int i = 0; i < modelo.getRowCount(); i++) {
			lista.add(comunicationCurso.getCurso(modelo.getValueAt(i, 1).toString()));
		}
		return lista;
	}

	private List<Area> recuperarAreas() {
		List<Area> lista = new LinkedList<Area>();
		if (modelo.getRowCount() > 0) {
			for (int i = 0; i < modelo.getRowCount(); i++) {
				lista.add(comunicationArea.findArea((String) modelo.getValueAt(i, 0)));
			}
		}
		return lista;
	}

	private boolean todoCorrecto() {
		if (textNombre.getText().equals("")) {
			return false;
		}
		if (textApellido.getText().equals("")) {
			return false;
		}
		if (textTelefono.getText().equals("")) {
			if (textEmail.getText().equals("")) {
				return false;
			}
			return true;
		}
		return true;
	}

	public void setAlumno(Alumno alumno) {
		this.textNombre.setText(alumno.getNombre());
		this.textApellido.setText(alumno.getApellido());
		this.textTelefono.setText(alumno.getTelefono());
		this.textEmail.setText(alumno.getEmail());
	}

	public void setNuevo(boolean bool, Alumno alumno) {
		this.nuevo = bool;
		if (!nuevo) {
			this.alumno = alumno;
			loadData();
		}
	}

	public void setNuevo(boolean b) {
		setNuevo(b, null);
	}

	public Contacto getContacto() {
		return this.contacto;
	}

}
